package club.gskj.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/***
 * 整合RabbitMQ
 *  1. 引入amqp场景 RabbitAutoConfiguration就会自动生效
 *  2. 自动像容器中放入con
 *      RabbitTemplate、amqpAdmin、CachingConnectionFactory、RabbitMessagingTemplate
 *  3. @EnableRabbit 开启MQ功能
 *  4. RabbitMQ所有的配置属性信息绑定在以下类中
 *      @ConfigurationProperties(prefix = "spring.rabbitmq")
 *      public class RabbitProperties
 *      配置MQ的一些信息，使用spring.rabbitmq.xxx即可
 *
 *  5. 监听消息，是同 @RabbitListeners；必须标注@EnableRabbit才能使用
 *      @RabbitListeners： 可以标注 类、方法上(监听那些消息队列)
 *      @RabbitHandler 方法上 (重载处理不同的消息类型内容)
 *
 *  本地事务失效问题
 *      同一个对象内事务方法互调默认失效,原因是绕过了代理对象,事务使用代理对象来控制
 *      解决：使用代理对象来调用事务方法
 *      aop-starter，引入了aspectj
 *         <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-starter-aop</artifactId>
 *         </dependency>
 *       @EnableAspectJAutoProxy 开启Aspectj动态代理功能，之后所有的动态代理都是Aspectj创建，即使没有接口也可以创建动态代理
 *       exposeProxy = true 对外暴露代理对象,本类互调用代理对象实现事务
 *
 *   使用seata控制分布式
 *      1. 每一个微服务必须先创建 undo_log表
 *      2. 导入seata依赖后，会自动导入 seata-all-0.7.1
 *        <dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
 *         </dependency>
 *      3. 安装事务协调器: seata服务器 https://github.com/seata/seata/releases 版本对应上面的seata-all-x.x.x版本
 *      解压缩 seata文件
 *      修改 registry.conf：注册文件，设置 registry type = "nacos" 设置用nacos作为注册中心
 *      4. 所有想要用到分布式事务的微服务都要是使用 DataSourceProxy来代理自己的数据源
 *      5. 每个使用分布式事务的微服务都要导入以下文件
 *          file.conf
 *          registry.conf
 *          修改file.conf   vgroup_mapping.{微服务名称application.name}-fescar-service-group = "default"
 *      6. 给分布式事务的大入口标注 @GlobalTransactional
 *          其他分支事务使用 Transactional即可
 */

@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }
}
